/***********************
CONFIGURACIÓN
1) Guardá OPENAI_API_KEY en Project Settings -> Script properties
   key: OPENAI_API_KEY
   value: sk-...

2) Ajustá estos índices si tu formulario cambia el orden de columnas.
   Campos esperados (en este orden):
   0 Marca temporal
   1 Nombre y apellido
   2 Teléfono
   3 Correo electrónico
   4 Dirección (calle y número)
   5 Barrio
   6 Descripción del reclamo
   7 Agregar foto (1 como máximo)  (URL o vacío)
************************/

const DESTINOS = {
  "Obras": "obras@ethosia.com.ar",
  "Servicios Públicos": "serviciospublicos@ethosia.com.ar",
  "Tránsito": "transito@ethosia.com.ar",
  "Habilitaciones": "habilitaciones@ethosia.com.ar",
  "Desarrollo Social": "desarrollosocial@ethosia.com.ar",
  "Salud": "salud@ethosia.com.ar",
  "Atención al Vecino": "atencionalvecino@ethosia.com.ar",
  "Otros": "atencionalvecino@ethosia.com.ar"
};

function onFormSubmit(e) {
  const row = e.values;

  const timestamp = row[0] || "";
  const nombre = row[1] || "";
  const tel = row[2] || "";
  const email = row[3] || "";
  const direccion = row[4] || "";
  const barrio = row[5] || "";
  const descripcion = row[6] || "";
  const fotoUrl = row[7] || "";

  const clasif = clasificarReclamoConIA_(descripcion, direccion, barrio);

  const tema = (clasif && clasif.tema) ? clasif.tema : "Otros";
  const destino = resolverDestino_(tema);

  const subject = `Reclamo ${tema} | ${clasif.urgencia || "Media"} | ${barrio}`;
  const body =
`Ingreso: ${timestamp}
Vecino: ${nombre}
Tel: ${tel}
Email: ${email}
Dirección: ${direccion}
Barrio: ${barrio}
Foto: ${fotoUrl}

Clasificación IA:
Tema: ${tema}
Subtema: ${clasif.subtema || ""}
Intención: ${clasif.intencion || ""}
Urgencia: ${clasif.urgencia || ""}
Resumen: ${clasif.resumen_1_linea || ""}

Descripción original:
${descripcion}
`;

  GmailApp.sendEmail(destino, subject, body);

  // Respuesta al vecino (si hay email)
  if (email && String(email).indexOf("@") !== -1) {
    const respuestaVecino = redactarRespuestaVecinoIA_({
      tema: tema,
      resumen: clasif.resumen_1_linea || "",
      urgencia: clasif.urgencia || "Media",
      destino_humano: tema,
      nombre: nombre,
      direccion: direccion,
      barrio: barrio,
      tel: tel,
      email: email,
      descripcion: descripcion
    });

    const subjVecino = `Re: Recepción de reclamo | ${tema}`;
    GmailApp.sendEmail(email, subjVecino, respuestaVecino);
  }
}

function resolverDestino_(tema) {
  return DESTINOS[tema] || DESTINOS["Otros"];
}

function clasificarReclamoConIA_(descripcion, direccion, barrio) {
  const apiKey = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");
  if (!apiKey) throw new Error("Falta OPENAI_API_KEY en Script Properties");

  const schema = {
    type: "object",
    additionalProperties: false,
    required: ["tema", "subtema", "intencion", "urgencia", "resumen_1_linea", "confianza"],
    properties: {
      tema: {
        type: "string",
        enum: ["Obras", "Servicios Públicos", "Tránsito", "Habilitaciones", "Desarrollo Social", "Salud", "Atención al Vecino", "Otros"]
      },
      subtema: { type: "string" },
      intencion: { type: "string", enum: ["Reclamo", "Consulta", "Denuncia", "Turno", "Sugerencia", "Otro"] },
      urgencia: { type: "string", enum: ["Alta", "Media", "Baja"] },
      resumen_1_linea: { type: "string" },
      confianza: { type: "string", enum: ["alta", "media", "baja"] }
    }
  };

  const prompt =
`Clasificá el reclamo del vecino.

Dirección: ${direccion}
Barrio: ${barrio}

Descripción:
${String(descripcion).slice(0, 5000)}
`.trim();

  const payload = {
    model: "gpt-4.1-mini",
    store: false,
    input: [
      { role: "system", content: "Sos mesa de entradas municipal. Clasificás reclamos con criterio práctico." },
      { role: "user", content: prompt }
    ],
    text: {
      format: {
        type: "json_schema",
        name: "reclamo",
        schema: schema,
        strict: true
      }
    }
  };

  const res = UrlFetchApp.fetch("https://api.openai.com/v1/responses", {
    method: "post",
    contentType: "application/json",
    headers: { Authorization: "Bearer " + apiKey },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });

  const status = res.getResponseCode();
  const raw = res.getContentText();

  if (status < 200 || status >= 300) {
    throw new Error("OpenAI error " + status + ": " + raw);
  }

  const json = JSON.parse(raw);
  const text = extractOutputText_(json);
  return JSON.parse(text);
}

function redactarRespuestaVecinoIA_(data) {
  const apiKey = PropertiesService.getScriptProperties().getProperty("OPENAI_API_KEY");
  if (!apiKey) throw new Error("Falta OPENAI_API_KEY en Script Properties");

  const tema = data.tema || "Otros";
  const resumen = data.resumen || "";
  const urgencia = data.urgencia || "Media";

  const datoFaltante = detectarDatoFaltante_(data);

  const schema = {
    type: "object",
    additionalProperties: false,
    required: ["respuesta"],
    properties: {
      respuesta: { type: "string" }
    }
  };

  const prompt =
`Redactá una respuesta breve y respetuosa para el vecino.
Máximo 70 palabras.
Debe confirmar recepción, indicar el área a la que se derivó, sugerir un plazo tentativo genérico sin prometer fechas, y pedir un dato faltante si es necesario.

Datos:
tema=${tema}
resumen=${resumen}
urgencia=${urgencia}
dato_faltante_sugerido=${datoFaltante || "ninguno"}

Contexto:
nombre=${data.nombre || ""}
direccion=${data.direccion || ""}
barrio=${data.barrio || ""}
telefono=${data.tel || ""}
`.trim();

  const payload = {
    model: "gpt-4.1-mini",
    store: false,
    input: [
      { role: "system", content: "Tono institucional, claro, breve. Español rioplatense neutral." },
      { role: "user", content: prompt }
    ],
    text: {
      format: {
        type: "json_schema",
        name: "respuesta_vecino",
        schema: schema,
        strict: true
      }
    }
  };

  const res = UrlFetchApp.fetch("https://api.openai.com/v1/responses", {
    method: "post",
    contentType: "application/json",
    headers: { Authorization: "Bearer " + apiKey },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });

  const status = res.getResponseCode();
  const raw = res.getContentText();

  if (status < 200 || status >= 300) {
    throw new Error("OpenAI error " + status + ": " + raw);
  }

  const json = JSON.parse(raw);
  const text = extractOutputText_(json);
  const obj = JSON.parse(text);

  let respuesta = (obj && obj.respuesta) ? String(obj.respuesta).trim() : "";
  if (!respuesta) throw new Error("La IA no devolvió respuesta");

  const words = respuesta.split(/\s+/).filter(Boolean).length;
  if (words > 70) respuesta = recortarA70Palabras_(respuesta);

  return respuesta;
}

function detectarDatoFaltante_(data) {
  const tema = data.tema || "Otros";
  const direccion = String(data.direccion || "").trim();
  const tel = String(data.tel || "").trim();
  const descripcion = String(data.descripcion || "").toLowerCase();

  if (!direccion) return "dirección (calle y número)";

  if (tema === "Habilitaciones") {
    const tieneCuit = /\b\d{2}-\d{8}-\d\b|\b\d{11}\b/.test(descripcion);
    if (!tieneCuit) return "CUIT o razón social";
  }

  if (tema === "Tránsito") {
    const tieneInterseccion = /(esquina|intersecci|cruce)/.test(descripcion) || /\b\d{1,5}\b/.test(direccion);
    if (!tieneInterseccion) return "ubicación precisa (calle y altura o intersección)";
  }

  if ((tema === "Desarrollo Social" || tema === "Salud") && !tel) {
    return "teléfono de contacto";
  }

  return "";
}

function extractOutputText_(respJson) {
  const output = (respJson && respJson.output) ? respJson.output : [];
  for (var i = 0; i < output.length; i++) {
    const item = output[i];
    if (item && item.type === "message" && item.content && item.content.length) {
      for (var j = 0; j < item.content.length; j++) {
        const c = item.content[j];
        if (c && (c.type === "output_text" || c.type === "text") && c.text) return c.text;
      }
    }
  }
  throw new Error("No se encontró output_text en la respuesta");
}

function recortarA70Palabras_(t) {
  const words = String(t).trim().split(/\s+/).filter(Boolean);
  return words.slice(0, 70).join(" ").replace(/\s+([.,;:!?])/g, "$1");
}
